package com.wzh.navcode.controller;

import com.wzh.navcode.annotention.PreventDirectAccess;
import com.wzh.navcode.config.SseEmitterUTF8;
import com.wzh.navcode.domain.entity.HotData;
import com.wzh.navcode.theadpool.ThreadPoolManager;
import com.wzh.navcode.service.HotDataSearchService;
import com.wzh.navcode.utils.TimeBasedValueUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import javax.annotation.PreDestroy;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @Author: wangzh
 * @Version: 1.0
 * @Description: 四大平台(百度 、 微博 、 掘金 、 知乎 、 b站)热点数据查询
 */
@RestController
@RequestMapping("/hotData")
@RequiredArgsConstructor
@Slf4j
public class HotDataSearchController {

    private final HotDataSearchService hotDataSearchService;

    /**
     * 提供一个HTTP GET接口，用于流式传输热门数据。
     * 添加PreventDirectAccess注解，以防止用户直接通过浏览器访问该接口。
     * @return SseEmitter对象，用于向客户端发送服务器发送事件（Server-Sent Events，SSE）。
     */
    @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    @PreventDirectAccess
    public SseEmitter streamHotData() {
        // 创建SseEmitter对象(使用SeEmitter对象返回中文乱码，所以使用了自定义的SseEmitterUTF8)
        SseEmitterUTF8 emitter = new SseEmitterUTF8(Long.MAX_VALUE);
        // 创建并执行定时任务
        ThreadPoolManager.scheduleAtFixedRate(() -> {
            try {
                // 获取各平台数据
                Map<String, List<HotData>> allData = new HashMap<>();
                allData.put("baidu", hotDataSearchService.crawlHotData("baidu"));
                allData.put("weibo", hotDataSearchService.crawlHotData("weibo"));
                allData.put("zhihu", hotDataSearchService.crawlHotData("bilibili"));
                allData.put("juejin", hotDataSearchService.crawlHotData("juejin"));

                // 分别发送每个平台的数据
                for (Map.Entry<String, List<HotData>> entry : allData.entrySet()) {
                    Map<String, Object> eventData = new HashMap<>(16);
                    eventData.put("platform", entry.getKey());
                    eventData.put("data", entry.getValue());
                    emitter.send(eventData);
                }
                log.info("Sent SSE data for all platforms");
            } catch (Exception e) {
                log.error("Error while sending SSE data", e);
                emitter.completeWithError(e);
            }
        }, 0, 60, TimeUnit.SECONDS);
        return emitter;
    }
}
